package betandregret.tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import java.util.Calendar;

import org.junit.Test;

import betandregret.exceptions.RegretException;
import betandregret.interfaces.IBetAndRegret.Systemereignis;
import betandregret.interfaces.IKundenBoundary;

/**
 * Tests der Systemoperation wettePlatzieren(...)
 * 
 */
public class KundeWettePlatzierenTest extends AbstractBetAndRegretTest {

	private static Calendar[] calendar;
	private static int[] sportarten;
	private static int[] basketballTeams;
	private static int[] rollstuhlBasketballTeams;
	private static int[] spiele;
	
	
	private boolean datenInitialisieren() {
		calendar = new Calendar[4];
		calendar[0] = Calendar.getInstance();
		calendar[0].set(2015, 1, 5, 18, 0);
		calendar[1] = Calendar.getInstance();
		calendar[1].set(2015, 1, 6, 20, 0);
		calendar[2] = Calendar.getInstance();
		calendar[2].set(2015, 1, 7, 20, 0);
		calendar[3] = Calendar.getInstance();
		calendar[3].set(2012, 1, 20, 23, 0);
		this.betAndRegretSystem.setDatum(calendar[3]);
		

		sportarten = new int[2];
		sportarten[0] = mitarbeiterBoundary.sportartEintragen("Basketball", 80);
		sportarten[1] = mitarbeiterBoundary.sportartEintragen(
				"Rollstuhlbasketball", 90);

		basketballTeams = new int[4];
		basketballTeams[0] = mitarbeiterBoundary.teamEintragen(
				"Venomous Monkeys", sportarten[0]);
		basketballTeams[1] = mitarbeiterBoundary.teamEintragen(
				"Banzai Bullets", sportarten[0]);
		basketballTeams[2] = mitarbeiterBoundary.teamEintragen(
				"Sole Survivors", sportarten[0]);
		basketballTeams[3] = mitarbeiterBoundary.teamEintragen("Average Joes",
				sportarten[0]);

		rollstuhlBasketballTeams = new int[4];
		rollstuhlBasketballTeams[0] = mitarbeiterBoundary.teamEintragen(
				"Mighty Tigers", sportarten[1]);
		rollstuhlBasketballTeams[1] = mitarbeiterBoundary.teamEintragen(
				"Silent Kamikaze Pilots", sportarten[1]);
		rollstuhlBasketballTeams[2] = mitarbeiterBoundary.teamEintragen(
				"Spinning Piledrivers", sportarten[1]);
		rollstuhlBasketballTeams[3] = mitarbeiterBoundary.teamEintragen(
				"The FlyBallers", sportarten[1]);
		
		
		spiele = new int[3];

		spiele[0] = mitarbeiterBoundary.spielEintragen(
				basketballTeams[0], basketballTeams[1], calendar[0], 80);
		spiele[1] = mitarbeiterBoundary.spielEintragen(
				rollstuhlBasketballTeams[0], rollstuhlBasketballTeams[1],
				calendar[1], 100);
		spiele[2] = mitarbeiterBoundary.spielEintragen(
				rollstuhlBasketballTeams[0], rollstuhlBasketballTeams[2],
				calendar[0], 50);
		
		return true;
	}
	
	@Test
	public void wettePlatzierenTest_Erfolgreich() {
		
		if(!datenInitialisieren()) fail("Dateninitialisierung");
		
		IKundenBoundary k = this.kundenBoundary;
		
		int kundenId1 = k.kundeEintragen("Hans Bernd");
		
		try {
			Systemereignis wette = this.kundenBoundary.wettePlatzieren(kundenId1, 100, spiele[1], rollstuhlBasketballTeams[1]);
			
			assertEquals("Wette erfolgreich platzieren", Systemereignis.WETTE_ERFOLGREICH_PLATZIERT, wette);
		}
		catch (RegretException re) {
			fail(re.getSystemereignis().name());
		}
	}
	
	@Test
	public void wettePlatzierenTest_TeamNichtBeteiligt() {
		
		if(!datenInitialisieren()) fail("Dateninitialisierung");
		
		IKundenBoundary k = this.kundenBoundary;
		
		int kundenId1 = k.kundeEintragen("Hans Bernd");
		
		try {
			this.kundenBoundary.wettePlatzieren(kundenId1, 100, spiele[1], rollstuhlBasketballTeams[2]);
			
			fail("Team nicht beteiligt");
		}
		catch (RegretException re) {
			assertEquals("Team nicht beteiligt", Systemereignis.TEAM_NICHT_BETEILIGT, re.getSystemereignis());
		}
	}
	
	@Test
	public void wettePlatzierenTest_BereitsGewettet() {
		
		if(!datenInitialisieren()) fail("Dateninitialisierung");
		
		IKundenBoundary k = this.kundenBoundary;
		
		int kundenId1 = k.kundeEintragen("Hans Bernd");
		
		try {
			this.kundenBoundary.wettePlatzieren(kundenId1, 100, spiele[1], rollstuhlBasketballTeams[0]);
			this.kundenBoundary.wettePlatzieren(kundenId1, 123, spiele[1], rollstuhlBasketballTeams[1]);
			
			fail("Bereits auf Spiel gewettet");
		}
		catch (RegretException re) {
			assertEquals("Bereits auf Spiel gewettet", Systemereignis.BEREITS_AUF_SPIEL_GEWETTET, re.getSystemereignis());
		}
	}
	
	@Test
	public void wettePlatzierenTest_BereitsGewettet2() {
		
		if(!datenInitialisieren()) fail("Dateninitialisierung");
		
		IKundenBoundary k = this.kundenBoundary;
		
		int kundenId1 = k.kundeEintragen("Hans Bernd");
		
		try {
			this.kundenBoundary.wettePlatzieren(kundenId1, 100, spiele[1], rollstuhlBasketballTeams[0]);
			this.kundenBoundary.wettePlatzieren(kundenId1, 111, spiele[0], basketballTeams[1]);
		}
		catch (RegretException re) {
			fail("Bereits auf Spiel gewettet (2)");
		}
	}
	
	@Test
	public void wettePlatzierenTest_BereitsBegonnen() {
		
		if(!datenInitialisieren()) fail("Dateninitialisierung");
		
		IKundenBoundary k = this.kundenBoundary;
		
		int kundenId1 = k.kundeEintragen("Hans Bernd");
		
		try {
			this.betAndRegretSystem.setDatum(calendar[2]);
			this.kundenBoundary.wettePlatzieren(kundenId1, 100, spiele[1], rollstuhlBasketballTeams[1]);
			
			fail("Spiel hat bereits begonnen");
		}
		catch (RegretException re) {
			assertEquals("Spiel hat bereits begonnen", Systemereignis.SPIEL_BEREITS_BEGONNEN, re.getSystemereignis());
		}
	}
	
	@Test
	public void wettePlatzierenTest_Wetteinsatz() {
		
		if(!datenInitialisieren()) fail("Dateninitialisierung");
		
		IKundenBoundary k = this.kundenBoundary;
		
		int kundenId1 = k.kundeEintragen("Hans Bernd");
		
		try {
			this.kundenBoundary.wettePlatzieren(kundenId1, 2, spiele[1], rollstuhlBasketballTeams[1]);
			
			fail("Wetteinsatz zu gering");
		}
		catch (RegretException re) {
			assertEquals("Wetteinsatz zu gering", Systemereignis.WETTEINSATZ_ZU_GERING, re.getSystemereignis());
		}
	}

}